package echo.nio.byteBuffer;

import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;

/**
 * @author： zhangnan
 * @date： 2025/4/20 16:46
 * @description： TODO
 * @modifiedBy：
 * @version: 1.0
 */
public class TestByteBufferExam {
    public static void main(String[] args) {
        //        案例场景
//        网络上有多条数据发送给服务端，数据之间使用\n进行分隔
//        但由于某种原因这些数据在按收时，被进行了重新组合，例如原始数据有3条为
//        Hello,world\n
//        I'm zhangsan\n
//        How are you?\n
//        变成了下面的两个byteBuffer（黏包即：Hello,world\nI'm zhangsan两个消息连在一起了，半包即：n\nHo 一条消息不完整)
//        Hello,world\nI'm zhangsan\nHo
//        w are you?\n
//        现在要求你编写程序，将错乱的数据恢复成原始的按\n分隔的数据

        ByteBuffer source = ByteBuffer.allocate(32);
        source.put("Hello,world\nI'm zhangsan\nHo".getBytes());
        split(source);
        source.put("w are you?\n".getBytes());
        split(source);
    }

    private static void split(ByteBuffer source) {
        // 切换为读模式
        source.flip();
        for (int i = 0; i < source.limit(); i++) {
            if (source.get(i) == '\n') {
                ByteBuffer target = ByteBuffer.allocate(i - source.position());
                for (int j = target.position(); j < target.limit(); j++) {
                    target.put(source.get());
                }
                target.flip();
                System.out.print(StandardCharsets.UTF_8.decode(target).toString());
            }
        }
        // 将未读取的内容放在最前面
        source.compact();
    }

}
